--- @since 25.2.26
--- @sync entry

-- 插件的入口函数，用于处理面板比例调整
local function entry(st, job)
	-- 获取当前的面板比例管理器
	local R = rt.mgr.ratio

	-- 确保 job 参数是表格式，兼容字符串输入
	job = type(job) == "string" and { args = { job } } or job

	-- 保存当前的面板比例状态，防止多次初始化
	st.parent = st.parent or R.parent
	st.current = st.current or R.current
	st.preview = st.preview or R.preview

	-- 从 job.args[1] 中解析操作类型和目标面板
	local act, to = string.match(job.args[1] or "", "(.-)-(.+)")

	-- 根据操作类型调整目标面板的比例
	if act == "min" then
		-- 最小化目标面板的比例
		st[to] = st[to] == R[to] and 0 or R[to]
	elseif act == "max" then
		-- 最大化目标面板的比例
		local max = st[to] == 65535 and R[to] or 65535
		st.parent = st.parent == 65535 and R.parent or st.parent
		st.current = st.current == 65535 and R.current or st.current
		st.preview = st.preview == 65535 and R.preview or st.preview
		st[to] = max
	end

	-- 如果尚未保存原始布局函数，保存并替换 Tab.layout 函数
	if not st.old then
		st.old = Tab.layout
		Tab.layout = function(self)
			-- 计算总比例
			local all = st.parent + st.current + st.preview
			-- 使用自定义比例重新布局
			self._chunks = ui.Layout()
				:direction(ui.Layout.HORIZONTAL) -- 水平布局
				:constraints({
					ui.Constraint.Ratio(st.parent, all), -- 父面板比例
					ui.Constraint.Ratio(st.current, all), -- 当前面板比例
					ui.Constraint.Ratio(st.preview, all), -- 预览面板比例
				})
				:split(self._area) -- 分割布局区域
		end
	end

	-- 如果没有操作类型，恢复原始布局
	if not act then
		Tab.layout, st.old = st.old, nil
		st.parent, st.current, st.preview = nil, nil, nil
	end

	-- 触发应用重绘，应用新的布局
	ya.app_emit("resize", {})
end

-- 返回插件的 entry 函数
return { entry = entry }